"""
所谓的高阶函数意思就是 把函数作为方法的参数传入
    注：方法作为参数传入的时候，只传入方法名字 不要带()

一下是几个内置的高阶函数，是python中自带的
    map(func(item) , list) 会对list中的每个元素执行func操作,产生一个新的序列
    reduce(func(one,nextone) ,list) 对list中相邻的两个元素做func操作，并重复
        注意：reduce需要导入 functools包

    filter(fun(item),list) 对list中的数据进行过滤，满足function中条件的
        会被返回，filter执行的结果是序列对象，如果要转为list需要通过list()转换



"""

# 高阶函数入门， 案例：计算两个数的绝对值之和 abs()可计算绝对值
#方法一
print("计算绝对值")
def method(a,b):
    return abs(a)+abs(b)
print(method(-2,3))

#方法二 :高阶函数，这里fun就是传入了一个 03 函数
def method2(a,b,fun):
    return fun(a)+fun(b)
def myfun(a):
    return a*2
res = method2(-2,3,abs)
print(res)

res = method2(2,3,myfun)
print(res)


def cheng2(item):
    return item*2

mylist = [1,2,3,4]
result = map(cheng2,mylist) #产生的是一个序列对象，而不是list
print(list(result)) # 需要把序列对象转为list

#相邻两个数据相加
import functools
def addCircle(one,nextOne):
    return  one+nextOne
#其实计算的就是 1+2+3+4
result = functools.reduce(addCircle,mylist)
print(result)

#相邻两个数相乘法
def chengCircle(one,nextOne):
    return one*nextOne
result = functools.reduce(chengCircle,mylist)
print(result)

# 过滤出列表中的偶数数据
def filterDouble(item):
    return item %2 == 0
result = filter(filterDouble,mylist)
print(list(result))



